﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Threading;

namespace SocketLib
{
    //public class AsyncSocket
    //{
    //    private bool connected;

    //    private Socket worker;

    //    private Queue<byte[]> sendqueue;

    //    private byte[] readbuffer;

    //    private SocketAsyncEventArgs SendArg;

    //    private SocketAsyncEventArgs ReadArg;

    //    private AutoResetEvent connectlock;

    //    private AutoResetEvent readlock;

    //    private AutoResetEvent writelock;

    //    private void InitSocket(int BufferSize)
    //    {
    //        worker.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 1000);
    //        worker.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, 1000);
    //        sendqueue = new Queue<byte[]>();
    //        readbuffer = new byte[BufferSize];
    //        SendArg = new SocketAsyncEventArgs();
    //        SendArg.Completed += new EventHandler<SocketAsyncEventArgs>(SendArg_Completed);
    //        ReadArg = new SocketAsyncEventArgs();
    //        ReadArg.SetBuffer(readbuffer, 0, readbuffer.Length);
    //        ReadArg.Completed += new EventHandler<SocketAsyncEventArgs>(ReadArg_Completed);
    //        connectlock = new AutoResetEvent(true);
    //        readlock = new AutoResetEvent(true);
    //        writelock = new AutoResetEvent(true);
    //    }


    //    void ReadArg_Completed(object sender, SocketAsyncEventArgs e)
    //    {
    //        //throw new NotImplementedException();
    //        readlock.WaitOne();
    //        ProcessRead(sender, e);
    //        readlock.Set();
    //    }

    //    void SendArg_Completed(object sender, SocketAsyncEventArgs e)
    //    {
    //        //throw new NotImplementedException();
    //        writelock.WaitOne();
    //        ProcessSend(sender, e);
    //        writelock.Set();
    //    }

    //    void ProcessRead(object sender, SocketAsyncEventArgs e)
    //    {
    //        if (connected)
    //        {
    //            if (e.BytesTransferred == 0)
    //            {
    //                Close();
    //                return;
    //            }
    //            if (worker.Connected)
    //            {
    //                if (e.LastOperation == SocketAsyncOperation.Receive && e.SocketError == SocketError.Success)
    //                {
    //                    if (Processor != null)
    //                    {
    //                        try
    //                        {
    //                            lock (Processor)
    //                            {
    //                                Processor.PushData(readbuffer, e.BytesTransferred);
    //                            }
    //                        }
    //                        catch (Exception ex)
    //                        {
    //                            RaisError(ex, "user program error in received");
    //                        }
    //                    }
    //                    if (Received != null)
    //                    {
    //                        try
    //                        {
    //                            Received(this, readbuffer, e.BytesTransferred);
    //                        }
    //                        catch (Exception ex)
    //                        {
    //                            UserException(this, ex);
    //                        }
    //                    }
    //                    WaitReceive();
    //                    lock (sendqueue)
    //                    {
    //                        if (sendqueue.Count > 0 && (!processsending))
    //                        {
    //                            SendData(sendqueue.Dequeue());
    //                        }
    //                    }
    //                }
    //                else
    //                {
    //                    RaisError(null, "last operation not read :" + e.LastOperation.ToString());
    //                }
    //            }
    //            else
    //            {
    //                RaisError(null, "socket error:" + e.SocketError.ToString());
    //            }
    //        }
    //    }

    //    void ProcessSend(object sender, SocketAsyncEventArgs e)
    //    {
    //        processsending = false;
    //        if (e.LastOperation == SocketAsyncOperation.Send)
    //        {
    //            if (e.SocketError == SocketError.Success)
    //            {
    //                try
    //                {
    //                    if (Sended != null)
    //                    {
    //                        Sended(this);
    //                    }
    //                }
    //                catch (Exception ex)
    //                {
    //                    RaisError(ex, "user program error in sended");
    //                }
    //                lock (sendqueue)
    //                {
    //                    if (sendqueue.Count > 0 && (!processsending))
    //                    {
    //                        SendData(sendqueue.Dequeue());
    //                    }
    //                    else
    //                    {
    //                        if (!connected)
    //                        {
    //                            Close();
    //                        }
    //                    }
    //                }
    //            }
    //            else
    //            {
    //                RaisError(null, "socket error:" + e.SocketError.ToString());
    //            }
    //        }
    //        else
    //        {
    //            RaisError(null, "last operation not send :" + e.LastOperation.ToString());
    //        }

    //    }

    //    private void Close()
    //    {
    //        this.Dispose();
    //    }

    //    public void Dispose()
    //    {
    //        ////throw new NotImplementedException();
    //        //using (worker)
    //        //{
    //        //    using (ReadArg) { }
    //        //    using (SendArg) { }
    //        //    if (Processor != null)
    //        //    {
    //        //        using (Processor) { }
    //        //    }
    //        //    if (worker.Connected)
    //        //    {
    //        //        worker.Disconnect(false);
    //        //        worker.Close();
    //        //    }
    //        //}
    //        //if (Disconnected != null)
    //        //{
    //        //    Disconnected(ID);
    //        //}
    //    }


    //}
}
